#define _CRT_SECURE_NO_WARNINGS 1

//#include <stdio.h>
//
//int main()
//{
//    printf("%s\n", __FILE__);     // 返回使用行代码所在的源文件名，包括路径
//    printf("%d\n", __LINE__);     // 返回行号
//    printf("%s\n", __DATE__);     // 返回程序被编译的日期
//    printf("%s\n", __TIME__);     // 返回程序被编译的时间
//    printf("%s\n", __FUNCTION__); // 返回所在函数的函数名
//    return 0;
//}

//#include <stdio.h>
//int main() 
//{
//    FILE* pf = fopen("log.txt", "a+"); //追加的形式，每运行一次就追加
//    if (pf == NULL) 
//    {
//        perror("fopen");
//        return 1;
//    }
//    for (int i = 0; i < 5; i++)
//    {
//        printf("* 错误日志 ");
//        printf("%d *\n", i + 1);
//        printf("发生时间：%s  %s\n", __DATE__, __TIME__);
//        printf("具体位置：%s，函数名为%s，第%d行。\n", __FILE__, __FUNCTION__, __LINE__);
//        printf("\n");
//    }
//    for (int i = 0; i < 5; i++)//写到文件
//    {
//        fprintf(pf,"* 错误日志 ");
//        fprintf(pf, "%d *\n", i + 1);
//        fprintf(pf, "发生时间：%s  %s\n", __DATE__, __TIME__);
//        fprintf(pf, "具体位置：%s，函数名为%s，第%d行。\n", __FILE__, __FUNCTION__, __LINE__);
//        fprintf(pf, "\n");
//    }
//    fclose(pf);
//    pf = NULL;
//    return 0;
//}

//#include <stdio.h>
//void print(char x,int y) 
//{
//    printf("变量%c的值是%d\n", x,y);
//}
//int main(void) 
//{
//    int a = 10;
//     //打印内容：变量a的值是10
//    print('a',a);
//
//    int b = 20;
//     //打印内容：变量b的值是20
//    print('b',b);
//
//    int c = 30;
//     //打印内容：变量c的值是30
//    print('c',c);
//
//    return 0;
//}

//#include <stdio.h>
//#define PRINT(X) printf("变量"#X"的值是%d\n", X);
//// #X 就会变成 X内容所定义的字符串
//
//int main() 
//{
//    // 打印内容：变量a的值是10
//    int a = 10;
//    PRINT(a); // printf("变量""a""的值是%d\n", a);
//
//    // 打印内容：变量b的值是20
//    int b = 20;
//    PRINT(b); // printf("变量""b"的值是%d\n", b);
//
//    // 打印内容：变量c的值是30
//    int c = 30;
//    PRINT(c); // printf("变量""c""的值是%d\n", c);
//
//    return 0;
//}
//#include <stdio.h>
//#define PRINT(X, FORMAT) printf("变量"#X"的值是 "FORMAT"\n", X);//format格式（格式化参数）
//int main() 
//{
//    // 打印内容：变量a的值是10
//    int a = 10;
//    PRINT(a, "%d");
//
//    // 打印内容：变量f的值是5.5
//    float f = 5.5f;
//    PRINT(f, "%.1f"); //替换成printf("变量""f""的值是 ""%.1f""\n", f);
//
//    return 0;
//}

//#include <stdio.h>
//#define CAT(X,Y) X##Y    //发现连3个也行
//int main() 
//{
//    int vs2003 = 100;
//    printf("%d\n", CAT(vs, 2003)); //替换成printf("%d\n", vs2003); 
//    return 0;
//}

//#include <stdio.h>
//#define MAX(X,Y) ((X)>(Y)?(X):(Y))
//int main() 
//{
//    int a = 10;
//    int b = 20;
//    int m = MAX(a, b); // int m = ((a)>(b) ? (a):(b))
//    printf("%d\n", m);
//    return 0;
//}
//#include <stdio.h>
//#include <stdlib.h>
//#define MALLOC(num, type) (type*)malloc(num*sizeof(type))
//int main()
//{
//    // 原本的写法：malloc(10*sizeof(int));
//    // 但我想这么写：malloc(10, int);
//    int* p = MALLOC(10, int); // (int*)malloc(10*sizeof(int))  
//    return 0;
//}

//#include <stdio.h>
//int main() 
//{
//    int arr[ARR_SIZE];
//    int i = 0;
//    for (i = 0; i < ARR_SIZE; i++) 
//    {
//        arr[i] = i;
//    }
//    for (i = 0; i < ARR_SIZE; i++) 
//    {
//        printf("%d ", arr[i]);
//    }
//    printf("\n");
//    return 0;
//}

//#include <stdio.h>
//#define __DEBUG__ // 就像一个开关一样
//int main()
//{
//    int arr[10] = { 0 };
//    int i = 0;
//    for (i = 0; i < 10; i++) 
//    {
//        arr[i] = i;
//#ifdef __DEBUG__ // 因为__DEBUG__被定义了，所以为真
//        printf("%d ", arr[i]); // 就打印数组    
//#endif // 包尾
//    }
//    return 0;
//}

//#include <stdio.h>
//#define TEST 0
//// #define TEST2 // 不定义
//int main() 
//{
//    /* 如果TEST定义了，下面参与编译 */
//    // 1
//#ifdef TEST
//    printf("1\n");
//#endif
//    // 2
//#if defined(TEST)
//    printf("2\n");
//#endif
//
//    /* 如果TEST2不定义，下面参与编译 */
//    // 1
//#ifndef TEST2
//    printf("3\n");
//#endif
//    // 2
//#if !defined(TEST2)
//    printf("4\n");
//#endif
//    return 0;
//}

//#if defined(OS_UNIX)
//#ifdef OPTION1
//unix_version_option1();
//#endif
//#ifdef OPTION2
//unix_version_option2();
//#endif
//#elif defined(OS_MSDOS)
//#ifdef OPTION2
//msdos_version_option2();
//#endif
//#endif
//#include<stdio.h>
//#define N 4
//#define Y(n) ((N+2)*n) /*这种定义在编程规范中是严格禁止的*/
//int main()
//{
//	//N=4  所以Y(n)=((4+2)*n)
//	//所以2 * (N + Y(5 + 1)) = 2 * (4 + (4 + 2) * 5 + 1 ) = 2 * 35 = 70
//	int z = 2 * (N + Y(5 + 1));
//	printf("%d", z);
//	return 0;
//}

//#include <stdio.h>
//#include <stddef.h>
//结构体起始地址加上该成员相对于起始地址的偏移量就是成员变量的地址。
//想要知道成员相对于结构体起始地址的偏移量，假设结构体起始地址位于0地址处，
//那么结构体成员变量的地址强制类型转换为size_t后就相当于该成员相对于起始地址的偏移量
//#define OFFSETOF(type, member) (size_t)(&(((type*)0)->member))//-0忽略了
//struct S
//{
//    int a;//0 1 2 3
//    char b;//4
//    //5
//    short c;//6  7
//};
//int main()
//{
//    printf("%d\n", offsetof(struct S, a));
//    printf("%d\n", offsetof(struct S, b));
//    printf("%d\n", offsetof(struct S, c));
//
//    printf("%d\n", OFFSETOF(struct S, a));
//    printf("%d\n", OFFSETOF(struct S, b));
//    printf("%d\n", OFFSETOF(struct S, c));
//    return 0;
//}
#include<stdio.h>
int main()
{
    int arr[3][4] = { 0 };
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
        }
    }
    return 0;
}